#include<unistd.h>
#include<string>
#include<iostream>
#include"ringbuf.hpp"

int data=10;
void* productor(void* arg)//生产者线程执行的方法
{
    ringbufmodule::ringbuf<int>* buf=static_cast<ringbufmodule::ringbuf<int>*>(arg);
    while(true)
    {
        sleep(1);
        buf->Equeue(data);
        std::cout<<"生产了一个数据:"<<data<<std::endl;
        data++;
    }
    return nullptr;
}

void* consumer(void*arg)//消费者线程执行的方法
{
    ringbufmodule::ringbuf<int>* buf=static_cast<ringbufmodule::ringbuf<int>*>(arg);
    int data=0;
    while(true)
    {
        buf->Pop(&data);
        std::cout<<"消费了一个数据:"<<data<<std::endl;
        sleep(1);
    }
    return nullptr;
}

int main()
{
    ringbufmodule::ringbuf<int> buf(16);

    pthread_t p1;//生产者线程
    pthread_t p2;//生产者线程
    pthread_t c1;//消费者线程
    pthread_t c2;//消费者线程
    pthread_t c3;//消费者线程

    pthread_create(&p1,nullptr,productor,(void*)&buf);
    pthread_create(&p2,nullptr,productor,(void*)&buf);
    pthread_create(&c1,nullptr,consumer,(void*)&buf);
    pthread_create(&c2,nullptr,consumer,(void*)&buf);
    pthread_create(&c3,nullptr,consumer,(void*)&buf);

    while(true)
    {
        sleep(1);
    }

    pthread_join(p1,nullptr);
    pthread_join(p2,nullptr);
    pthread_join(c1,nullptr);
    pthread_join(c2,nullptr);
    pthread_join(c3,nullptr);
    return 0;
}